package jokode

import (
	"fmt"
	"os"
)

type LogConfig struct {
	Level      string `json:"level,omitempty" yaml:"level,omitempty"`           // 输出的最低日志等级, DEBUG < INFO < WARN < ERROR < FATAL
	FileName   string `json:"fileName,omitempty" yaml:"fileName,omitempty"`     // 输出日志文件名
	MaxSize    int    `json:"maxSize,omitempty" yaml:"maxSize,omitempty"`       // 日志文件的最大大小, 单位 MB, 默认 100 MB
	MaxAge     int    `json:"maxAge,omitempty" yaml:"maxAge,omitempty"`         // 根据文件名中编码的时间戳保留的旧日志文件的最大天数
	MaxBackups int    `json:"maxBackups,omitempty" yaml:"maxBackups,omitempty"` // 要保留的旧日志文件的最大数量, 默认是保留所有旧的日志文件
	OutToStdIo bool   `json:"outToStdIo,omitempty" yaml:"outToStdIo,omitempty"` // 是否输出到控制台, 默认输出
	TraceStack bool   `json:"traceStack,omitempty" yaml:"traceStack,omitempty"` // 是否输出堆栈信息
}

func NewLogConfig() *LogConfig {
	return FixLogConfigDefValues(nil)
}

func FixLogConfigDefValues(cfg *LogConfig) *LogConfig {
	defLevel := LogLevelStrInfo

	if runMode := GetRunMode(); runMode.IsUnderDev() {
		defLevel = LogLevelStrDebug
	}

	result := &LogConfig{
		Level:      defLevel,
		MaxSize:    100,
		MaxAge:     30,
		MaxBackups: 0,
		OutToStdIo: true,
		TraceStack: false,
	}

	if cfg == nil {
		result.FileName = getDefLogFilePath()
		return result
	}

	if cfg.Level != "" {
		result.Level = cfg.Level
	}

	if cfg.FileName == "" {
		result.FileName = getDefLogFilePath()
	} else {
		result.FileName = cfg.FileName
	}

	if cfg.MaxAge > 0 {
		result.MaxAge = cfg.MaxAge
	}

	if cfg.MaxBackups > 0 {
		result.MaxBackups = cfg.MaxBackups
	}

	result.OutToStdIo = cfg.OutToStdIo
	result.TraceStack = cfg.TraceStack

	return result
}

func getDefLogFilePath() string {
	return fmt.Sprintf("%s%c%s.log",
		"logs",
		os.PathSeparator,
		GetRuntimeDir())
}
